package TestesDoModel;

import model.ListaDeReproducao;
import model.ListasDeReproducao;

import org.junit.*;

public class TestaListasDeReproducao {
	ListaDeReproducao lista1;
	ListaDeReproducao lista2;
	ListasDeReproducao listas;
	
	
	@Before
	public void criaListasDeReproducao(){
		lista1 = new ListaDeReproducao("Roberto Carlos");
		lista2 = new ListaDeReproducao("Sidney Magal");
		listas = new ListasDeReproducao();
	}
	
	@Test
	public void testaAddListaDeReproducao() throws Exception{
		listas.addListaDeReproducao(lista1);
		listas.addListaDeReproducao(lista2);
		try{
			listas.addListaDeReproducao(lista1);
			Assert.fail("Deveria ter ocorrido erro pois foi adicionada uma lista ja existente");
		} catch(Exception e){
			Assert.assertEquals("Mensagem errada", "Esta playList ja existe no conjunto de Listas", e.getMessage());
		}
	}
	
	@Test
	public void testaRemoveListaDeReproducao() throws Exception{
		listas.addListaDeReproducao(lista1);
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("O nome da Lista esta errado", "Roberto Carlos", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O nome da Lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(1));
		listas.removeListaDeReproducao(lista2);
		Assert.assertEquals("O tamanho de Listas esta errado", 1, listas.exibeListasDeReproducaoAtuais().size());
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("O tamanho de Listas esta errado", 2, listas.exibeListasDeReproducaoAtuais().size());
		listas.removeListaDeReproducao(lista1);
		Assert.assertEquals("O nome da lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O tamanho de Listas esta errado", 1, listas.exibeListasDeReproducaoAtuais().size());
		listas.addListaDeReproducao(lista1);
		Assert.assertEquals("O tamanho de Listas esta errado", 2, listas.exibeListasDeReproducaoAtuais().size());
		Assert.assertEquals("O nome da lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O nome de lista esta errado", "Roberto Carlos", listas.exibeListasDeReproducaoAtuais().get(1));
	}
	
	@Test
	public void testaRemoveListaDeReproducaoPeloNome() throws Exception{
		listas.addListaDeReproducao(lista1);
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("O nome da Lista esta errado", "Roberto Carlos", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O nome da Lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(1));
		listas.removeListaDeReproducaoPeloNome("Sidney Magal");
		Assert.assertEquals("O tamanho de Listas esta errado", 1, listas.exibeListasDeReproducaoAtuais().size());
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("O tamanho de Listas esta errado", 2, listas.exibeListasDeReproducaoAtuais().size());
		listas.removeListaDeReproducaoPeloNome("Roberto Carlos");
		Assert.assertEquals("O nome da lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O tamanho de Listas esta errado", 1, listas.exibeListasDeReproducaoAtuais().size());
		listas.addListaDeReproducao(lista1);
		Assert.assertEquals("O tamanho de Listas esta errado", 2, listas.exibeListasDeReproducaoAtuais().size());
		Assert.assertEquals("O nome da lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O nome de lista esta errado", "Roberto Carlos", listas.exibeListasDeReproducaoAtuais().get(1));
	}
	
	@Test
	public void testaBuscaListaDeReproducao() throws Exception{
		listas.addListaDeReproducao(lista1);
		Assert.assertEquals("A Lista nao foi encontrada", lista1, listas.buscaListaDeReproducao("Roberto Carlos"));
		try{
			listas.buscaListaDeReproducao("Sidney Magal");
			Assert.fail("Deveria ocorrer um erro pois esta Lista nao foi adicionada em Listas");
		}
		catch(Exception e){
			Assert.assertEquals("Mensagem errada", "playList nao Encontrada", e.getMessage());
		}
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("A Lista nao foi encontrada", lista2, listas.buscaListaDeReproducao("Sidney Magal"));
	}
	
	@Test
	public void testaExibeListasDeReproducao() throws Exception{
		listas.addListaDeReproducao(lista1);
		listas.addListaDeReproducao(lista2);
		Assert.assertEquals("O nome da Lista esta errado", "Roberto Carlos", listas.exibeListasDeReproducaoAtuais().get(0));
		Assert.assertEquals("O nome da Lista esta errado", "Sidney Magal", listas.exibeListasDeReproducaoAtuais().get(1));
	}

}
